import axios, { AxiosResponse } from 'axios';
import { Logger } from '@/utils/logger';

export interface LLMConfig {
  provider: 'qwen' | 'deepseek' | 'private';
  apiKey: string;
  endpoint?: string;
  model?: string;
  temperature?: number;
  maxTokens?: number;
  timeout?: number;
}

export interface LLMMessage {
  role: 'system' | 'user' | 'assistant';
  content: string;
}

export interface LLMResponse {
  content: string;
  usage?: {
    promptTokens: number;
    completionTokens: number;
    totalTokens: number;
  };
  model?: string;
  finishReason?: string;
}

export abstract class BaseLLMService {
  protected config: LLMConfig;
  protected logger: Logger;

  constructor(config: LLMConfig) {
    this.config = config;
    this.logger = new Logger(`LLM_${config.provider.toUpperCase()}`);
  }

  /**
   * 发送消息到LLM
   */
  abstract sendMessage(messages: LLMMessage[]): Promise<LLMResponse>;

  /**
   * 测试连接
   */
  abstract testConnection(): Promise<{ success: boolean; message: string; responseTime?: number }>;

  /**
   * 创建健康分析提示词
   */
  protected createHealthAnalysisPrompt(
    healthData: any, 
    analysisType: string, 
    userProfile?: any
  ): LLMMessage[] {
    const systemPrompt = this.getSystemPrompt(analysisType);
    const userPrompt = this.createUserPrompt(healthData, analysisType, userProfile);

    return [
      { role: 'system', content: systemPrompt },
      { role: 'user', content: userPrompt }
    ];
  }

  /**
   * 获取系统提示词
   */
  private getSystemPrompt(analysisType: string): string {
    const basePrompt = `你是一个专业的健康分析AI助手，具有丰富的医学知识和健康管理经验。请基于用户的健康数据提供准确、实用的分析和建议。

重要原则：
1. 基于科学证据进行分析
2. 提供具体可行的建议
3. 避免给出医疗诊断
4. 建议用户在需要时咨询专业医生
5. 使用通俗易懂的语言
6. 保持积极正面的态度

响应格式要求：
- 使用JSON格式返回
- 包含analysis（分析内容）、recommendations（建议列表）、score（评分0-100）字段
- 建议列表应包含3-5条具体建议`;

    const typeSpecificPrompts = {
      sleep: `
你专门分析睡眠健康数据，包括：
- 睡眠时长和质量评估
- 睡眠阶段分析（深度睡眠、浅度睡眠、REM睡眠）
- 睡眠效率评估
- 作息规律分析
- 睡眠改善建议`,

      stress: `
你专门分析压力和心理健康数据，包括：
- 压力水平评估
- 心率变异性分析
- 压力趋势识别
- 放松和减压建议
- 生活方式调整建议`,

      exercise: `
你专门分析运动和活动数据，包括：
- 运动量和强度评估
- 卡路里消耗分析
- 运动类型和频率建议
- 运动计划制定
- 运动安全建议`,

      general: `
你提供综合性健康分析，包括：
- 整体健康状况评估
- 各项健康指标关联分析
- 生活方式建议
- 健康目标设定
- 长期健康规划`
    };

    return basePrompt + (typeSpecificPrompts[analysisType] || typeSpecificPrompts.general);
  }

  /**
   * 创建用户提示词
   */
  private createUserPrompt(healthData: any, analysisType: string, userProfile?: any): string {
    let prompt = `请分析以下健康数据：\n\n`;

    // 添加用户基本信息
    if (userProfile) {
      prompt += `用户信息：\n`;
      if (userProfile.age) prompt += `- 年龄：${userProfile.age}岁\n`;
      if (userProfile.gender) prompt += `- 性别：${userProfile.gender === 'male' ? '男性' : userProfile.gender === 'female' ? '女性' : '其他'}\n`;
      if (userProfile.height) prompt += `- 身高：${userProfile.height}cm\n`;
      if (userProfile.weight) prompt += `- 体重：${userProfile.weight}kg\n`;
      prompt += `\n`;
    }

    // 添加健康数据
    prompt += `健康数据：\n`;

    if (analysisType === 'sleep' && healthData.sleepData) {
      const sleep = healthData.sleepData;
      prompt += `睡眠数据：\n`;
      prompt += `- 睡眠日期：${sleep.sleepDate}\n`;
      prompt += `- 上床时间：${sleep.bedtime}\n`;
      prompt += `- 入睡时间：${sleep.sleepStart}\n`;
      prompt += `- 醒来时间：${sleep.wakeTime}\n`;
      prompt += `- 总睡眠时长：${sleep.totalDuration}分钟\n`;
      prompt += `- 深度睡眠：${sleep.deepSleep}分钟\n`;
      prompt += `- 浅度睡眠：${sleep.lightSleep}分钟\n`;
      prompt += `- REM睡眠：${sleep.remSleep}分钟\n`;
      prompt += `- 清醒时间：${sleep.awakeDuration}分钟\n`;
      prompt += `- 睡眠效率：${sleep.sleepEfficiency}%\n`;
      prompt += `- 醒来次数：${sleep.wakeUpCount}次\n`;
      if (sleep.sleepScore) prompt += `- 睡眠得分：${sleep.sleepScore}分\n`;
    }

    if (healthData.dailyData) {
      const daily = healthData.dailyData;
      prompt += `\n日常活动数据：\n`;
      prompt += `- 步数：${daily.steps}步\n`;
      prompt += `- 距离：${daily.distance}公里\n`;
      prompt += `- 卡路里消耗：${daily.calories}千卡\n`;
      prompt += `- 活跃时长：${daily.activeMinutes}分钟\n`;
      if (daily.averageHeartRate) prompt += `- 平均心率：${daily.averageHeartRate}次/分\n`;
      if (daily.stressLevel) prompt += `- 压力水平：${daily.stressLevel}/100\n`;
    }

    if (healthData.trends && analysisType === 'general') {
      prompt += `\n趋势数据：\n`;
      Object.entries(healthData.trends).forEach(([key, trend]: [string, any]) => {
        prompt += `- ${key}趋势：${trend.trend}，变化${trend.change}%\n`;
      });
    }

    prompt += `\n请提供详细的分析和建议，返回JSON格式的结果。`;

    return prompt;
  }

  /**
   * 通用HTTP请求方法
   */
  protected async makeRequest(
    url: string, 
    data: any, 
    headers: Record<string, string> = {}
  ): Promise<AxiosResponse> {
    const timeout = this.config.timeout || 30000;
    
    try {
      const response = await axios.post(url, data, {
        headers: {
          'Content-Type': 'application/json',
          ...headers
        },
        timeout
      });

      return response;
    } catch (error) {
      if (error.response) {
        this.logger.error('LLM API error response', {
          status: error.response.status,
          data: error.response.data,
          provider: this.config.provider
        });
        throw new Error(`LLM API错误: ${error.response.status} - ${error.response.data?.message || '未知错误'}`);
      } else if (error.request) {
        this.logger.error('LLM API network error', {
          message: error.message,
          provider: this.config.provider
        });
        throw new Error('网络连接错误，请检查网络设置');
      } else {
        this.logger.error('LLM API request error', {
          message: error.message,
          provider: this.config.provider
        });
        throw new Error(`请求错误: ${error.message}`);
      }
    }
  }

  /**
   * 解析LLM响应中的JSON
   */
  protected parseAnalysisResult(content: string): any {
    try {
      // 尝试直接解析JSON
      if (content.trim().startsWith('{')) {
        return JSON.parse(content);
      }

      // 尝试提取JSON代码块
      const jsonMatch = content.match(/```json\s*([\s\S]*?)\s*```/);
      if (jsonMatch) {
        return JSON.parse(jsonMatch[1]);
      }

      // 尝试提取大括号内容
      const braceMatch = content.match(/\{[\s\S]*\}/);
      if (braceMatch) {
        return JSON.parse(braceMatch[0]);
      }

      // 如果无法解析JSON，创建默认结构
      return {
        analysis: content,
        recommendations: ['基于分析内容，建议保持健康的生活方式'],
        score: 75
      };
    } catch (error) {
      this.logger.warn('Failed to parse LLM response as JSON', {
        content: content.substring(0, 200),
        error: error.message
      });

      return {
        analysis: content,
        recommendations: ['基于分析内容，建议保持健康的生活方式'],
        score: 75
      };
    }
  }

  /**
   * 验证分析结果格式
   */
  protected validateAnalysisResult(result: any): any {
    const validated = {
      analysis: result.analysis || '分析结果不可用',
      recommendations: Array.isArray(result.recommendations) 
        ? result.recommendations 
        : ['建议保持健康的生活方式'],
      score: typeof result.score === 'number' && result.score >= 0 && result.score <= 100 
        ? result.score 
        : 75
    };

    // 确保recommendations是字符串数组
    validated.recommendations = validated.recommendations
      .filter(rec => typeof rec === 'string')
      .slice(0, 10); // 最多10条建议

    return validated;
  }
}